package com.sojson.util.linux;

import java.io.IOException;
import java.io.OutputStream;

import com.sojson.util.linux.impl.Ssh2UtilImpl;

/**
 * 连接Linux工具类
 * 
 * @author liu
 * @date 2020-07-30
 */
public class LinuxUtil {

    private static final LinuxUtilInterface LINUX_UTILS_INTERFACE = Ssh2UtilImpl.getInstances();
    /** 默认超时时间(毫秒) */
    private static final long timeOut = 60 * 1000;

    /**
     * 让Linux服务器执行一段命令,多个命令用;分隔,返回服务器给的状态码
     * 状态码为null表示还没有返回状态码,如果一段命令要执行很长时间,提前获取的会是null
     * 
     * @param comm
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetStatusCode(String comm) throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetStatusCode(comm, timeOut);
    }

    /**
     * 让Linux服务器执行一段命令,多个命令用;分隔,返回服务器给的状态码
     * 状态码为null表示还没有返回状态码,如果一段命令要执行很长时间,提前获取的会是null
     * 
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetStatusCode(String comm, long timeOut) throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetStatusCode(comm, timeOut);
    }

    /**
     * 让Linux服务器执行一段命令,多个命令用;分隔,返回服务器给的状态码(长连接)
     * 状态码为null表示还没有返回状态码,如果一段命令要执行很长时间,提前获取的会是null
     * 
     * @param conn 连接对象
     * @param comm
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetStatusCode(LinuxBean conn, String comm) throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetStatusCode(conn, comm, timeOut);
    }

    /**
     * 让Linux服务器执行一段命令,多个命令用;分隔,返回服务器给的状态码(长连接)
     * 状态码为null表示还没有返回状态码,如果一段命令要执行很长时间,提前获取的会是null
     * 
     * @param conn 连接对象
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetStatusCode(LinuxBean conn, String comm, long timeOut)
        throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetStatusCode(conn, comm, timeOut);
    }

    /**
     * 执行Linux命令,返回读取到的字符串集合
     * 
     * @param comm
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetStringList(String comm) throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetStringList(comm, timeOut);
    }

    /**
     * 执行Linux命令,返回读取到的字符串集合
     * 
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetStringList(String comm, long timeOut) throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetStringList(comm, timeOut);
    }

    /**
     * 执行Linux命令,返回读取到的字符串集合(长连接)
     * 
     * @param conn 连接对象
     * @param comm
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetStringList(LinuxBean conn, String comm) throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetStringList(conn, comm, timeOut);
    }

    /**
     * 执行Linux命令,返回读取到的字符串集合(长连接)
     * 
     * @param conn 连接对象
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetStringList(LinuxBean conn, String comm, long timeOut)
        throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetStringList(conn, comm, timeOut);
    }

    /**
     * 执行Linux命令,返回读取到的字节流
     * 
     * @param comm
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetInputStream(String comm) throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetInputStream(comm, timeOut);
    }

    /**
     * 执行Linux命令,返回读取到的字节流
     * 
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetInputStream(String comm, long timeOut) throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetInputStream(comm, timeOut);
    }

    /**
     * 执行Linux命令,返回读取到的字节流(长连接)
     * 
     * @param conn 连接对象
     * @param comm
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetInputStream(LinuxBean conn, String comm) throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetInputStream(conn, comm, timeOut);
    }

    /**
     * 执行Linux命令,返回读取到的字节流(长连接)
     * 
     * @param conn 连接对象
     * @param comm
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return
     * @throws IOException
     */
    public static LinuxBean executiveCommandGetInputStream(LinuxBean conn, String comm, long timeOut)
        throws IOException {
        return LINUX_UTILS_INTERFACE.executiveCommandGetInputStream(conn, comm, timeOut);
    }

    /**
     * 执行Linux命令,上传文件
     * 
     * @param filePath 本地文件路径
     * @param targetPath 服务器文件路径
     * @throws IOException
     */
    public static void upload(String filePath, String targetPath) throws IOException {
        LINUX_UTILS_INTERFACE.upload(filePath, targetPath);
    }

    /**
     * 执行Linux命令,上传文件(长连接)
     * 
     * @param conn 连接对象
     * @param filePath 本地文件路径
     * @param targetPath 服务器文件路径
     * @throws IOException
     */
    public static void upload(LinuxBean conn, String filePath, String targetPath) throws IOException {
        LINUX_UTILS_INTERFACE.upload(conn, filePath, targetPath);
    }

    /**
     * 执行Linux命令,上传文件
     * 
     * @param bytes 文件字节流
     * @param filePath 路径
     * @param fileName 文件名
     * @throws IOException
     */
    public static void upload(byte[] bytes, String filePath, String fileName) throws IOException {
        LINUX_UTILS_INTERFACE.upload(bytes, filePath, fileName);
    }

    /**
     * 执行Linux命令,上传文件(长连接)
     * 
     * @param conn 连接对象
     * @param bytes 文件字节流
     * @param filePath 路径
     * @param fileName 文件名
     * @throws IOException
     * @return
     */
    public static void upload(LinuxBean conn, byte[] bytes, String filePath, String fileName) throws IOException {
        LINUX_UTILS_INTERFACE.upload(conn, bytes, filePath, fileName);
    }

    /**
     * 执行Linux命令,删除文件
     * 
     * @param conn 连接对象
     * @param fileName 文件路径名
     * @return 
     * @throws IOException
     */
    public static LinuxBean remove(String fileName) throws IOException {
        return LINUX_UTILS_INTERFACE.remove(fileName, timeOut);
    }

    /**
     * 执行Linux命令,删除文件
     * 
     * @param conn 连接对象
     * @param fileName 文件路径名
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return 
     * @throws IOException
     */
    public static LinuxBean remove(String fileName, long timeOut) throws IOException {
        return LINUX_UTILS_INTERFACE.remove(fileName, timeOut);
    }

    /**
     * 执行Linux命令,删除文件(长连接)
     * 
     * @param conn 连接对象
     * @param fileName 文件路径名
     * @return 
     * @throws IOException
     */
    public static LinuxBean remove(LinuxBean conn, String fileName) throws IOException {
        return LINUX_UTILS_INTERFACE.remove(conn, fileName, timeOut);
    }

    /**
     * 执行Linux命令,删除文件(长连接)
     * 
     * @param conn 连接对象
     * @param fileName 文件路径名
     * @param timeOut 超时时间(毫秒),不设置会导致读数据的时候读一下就结束,结果不完整,状态码也可能因为执行时间久,提前获取导致获取不到
     * @return 
     * @throws IOException
     */
    public static LinuxBean remove(LinuxBean conn, String fileName, long timeOut) throws IOException {
        return LINUX_UTILS_INTERFACE.remove(conn, fileName, timeOut);
    }

    /**
     * 执行Linux命令,下载文件
     * 
     * @param filePath 服务器文件路径
     * @param targetPath 本地文件路径
     * @throws IOException
     */
    public static void download(String filePath, String targetPath) throws IOException {
        LINUX_UTILS_INTERFACE.download(filePath, targetPath);
    }

    /**
     * 执行Linux命令,下载文件(长连接)
     * 
     * @param conn 连接对象
     * @param filePath 服务器文件路径
     * @param targetPath 本地文件路径
     * @throws IOException
     */
    public static void download(LinuxBean conn, String filePath, String targetPath) throws IOException {
        LINUX_UTILS_INTERFACE.download(conn, filePath, targetPath);
    }

    /**
     * 执行Linux命令,下载文件
     * 
     * @param filePath 文件路径
     * @return
     * @throws IOException
     */
    public static OutputStream download(String filePath) throws IOException {
        return LINUX_UTILS_INTERFACE.download(filePath);
    }

    /**
     * 执行Linux命令,下载文件(长连接)
     * 
     * @param conn 连接对象
     * @param filePath 文件路径
     * @return
     * @throws IOException
     */
    public static OutputStream download(LinuxBean conn, String filePath) throws IOException {
        return LINUX_UTILS_INTERFACE.download(conn, filePath);
    }

    /**
     * 获取连接对象
     * 
     * @return
     * @throws IOException
     */
    public static LinuxBean getConnection() throws IOException {
        return LINUX_UTILS_INTERFACE.getConnection();
    }

    /**
     * 获取连接对象
     * 
     * @param ip IP
     * @param password 密码
     * @return
     * @throws IOException
     */
    public static LinuxBean getConnection(String ip, String password) throws IOException {
        return LINUX_UTILS_INTERFACE.getConnection(ip, password);
    }

    /**
     * 获取连接对象
     * 
     * @param ip IP
     * @param username 帐号
     * @param password 密码
     * @return
     * @throws IOException
     */
    public static LinuxBean getConnection(String ip, String username, String password) throws IOException {
        return LINUX_UTILS_INTERFACE.getConnection(ip, username, password);
    }

    /**
     * 获取连接对象
     * 
     * @param ip IP
     * @param port 端口号
     * @param password 密码
     * @return
     * @throws IOException
     */
    public static LinuxBean getConnection(String ip, int port, String password) throws IOException {
        return LINUX_UTILS_INTERFACE.getConnection(ip, port, password);
    }

    /**
     * 获取连接对象
     * 
     * @param ip IP
     * @param port 端口号
     * @param username 帐号
     * @param password 密码
     * @return
     * @throws IOException
     */
    public static LinuxBean getConnection(String ip, int port, String username, String password) throws IOException {
        return LINUX_UTILS_INTERFACE.getConnection(ip, port, username, password);
    }

    /**
     * 关闭连接(单个连接,顶级连接,比如:一级连接)
     * 
     * @param conn 要关闭的对象
     * @throws IOException
     */
    public static void closeOne(LinuxBean conn) throws IOException {
        LINUX_UTILS_INTERFACE.utilCloseOne(conn);
    }

    /**
     * 关闭连接(一组连接,比如:一级连接,二级连接,三级连接...)
     * 
     * @param conn 要关闭的对象集合
     * @throws IOException
     */
    public static void close(LinuxBean conn) throws IOException {
        LINUX_UTILS_INTERFACE.utilClose(conn);
    }

    /**
     * 关闭连接(多组连接,每组除顶级外都是List,顶级是一个Object,比如:顶级连接,{二级连接...},{三级连接...})
     * 
     * @param conn 要关闭的对象集合
     * @throws IOException
     */
    public static void closeList(LinuxBean conn) throws IOException {
        LINUX_UTILS_INTERFACE.utilCloseList(conn);
    }

}